/**
 * 表单验证工具函数
 * 提供常用的表单数据验证方法
 */

/**
 * 验证手机号码是否有效
 * @param {string} phone - 手机号码
 * @returns {boolean} 是否为有效的手机号码
 */
export function isValidPhone(phone) {
  // 中国大陆手机号，11位数字，以1开头
  const regex = /^1[3-9]\d{9}$/;
  return regex.test(phone);
}

/**
 * 验证邮箱是否有效
 * @param {string} email - 电子邮箱
 * @returns {boolean} 是否为有效的电子邮箱
 */
export function isValidEmail(email) {
  const regex = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
  return regex.test(email);
}

/**
 * 验证身份证号码是否有效
 * @param {string} idCard - 身份证号码
 * @returns {boolean} 是否为有效的身份证号码
 */
export function isValidIdCard(idCard) {
  // 18位身份证号码验证
  const regex = /(^\d{17}(\d|X|x)$)/;
  if (!regex.test(idCard)) return false;
  
  // 加权因子
  const weightFactor = [7, 9, 10, 5, 8, 4, 2, 1, 6, 3, 7, 9, 10, 5, 8, 4, 2];
  // 校验码
  const checkCode = ['1', '0', 'X', '9', '8', '7', '6', '5', '4', '3', '2'];
  
  // 获取前17位
  const idCardWi = idCard.substring(0, 17);
  // 获取第18位
  const idCardZ = idCard.substring(17, 18).toUpperCase();
  
  // 计算校验和
  let total = 0;
  for (let i = 0; i < 17; i++) {
    total += parseInt(idCardWi.substring(i, i + 1)) * weightFactor[i];
  }
  
  // 计算校验码
  const index = total % 11;
  
  // 检查第18位是否正确
  return idCardZ === checkCode[index];
}

/**
 * 验证密码强度
 * @param {string} password - 密码
 * @param {Object} [options={}] - 验证选项
 * @param {number} [options.minLength=8] - 最小长度
 * @param {boolean} [options.needNumber=true] - 是否需要包含数字
 * @param {boolean} [options.needLowercase=true] - 是否需要包含小写字母
 * @param {boolean} [options.needUppercase=true] - 是否需要包含大写字母
 * @param {boolean} [options.needSpecialChar=true] - 是否需要包含特殊字符
 * @returns {Object} 包含验证结果和消息的对象
 */
export function checkPasswordStrength(password, options = {}) {
  const {
    minLength = 8,
    needNumber = true,
    needLowercase = true,
    needUppercase = true,
    needSpecialChar = true
  } = options;
  
  // 初始化结果
  const result = {
    valid: true,
    message: '密码强度符合要求',
    details: {
      length: password.length >= minLength,
      hasNumber: !needNumber || /\d/.test(password),
      hasLowercase: !needLowercase || /[a-z]/.test(password),
      hasUppercase: !needUppercase || /[A-Z]/.test(password),
      hasSpecialChar: !needSpecialChar || /[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]/.test(password)
    }
  };
  
  // 检查是否满足所有要求
  const allValid = Object.values(result.details).every(item => item === true);
  
  if (!allValid) {
    result.valid = false;
    result.message = '密码强度不符合要求';
    
    if (!result.details.length) {
      result.message = `密码长度不能少于${minLength}位`;
    } else if (!result.details.hasNumber) {
      result.message = '密码需要包含数字';
    } else if (!result.details.hasLowercase) {
      result.message = '密码需要包含小写字母';
    } else if (!result.details.hasUppercase) {
      result.message = '密码需要包含大写字母';
    } else if (!result.details.hasSpecialChar) {
      result.message = '密码需要包含特殊字符';
    }
  }
  
  return result;
}

/**
 * 验证字符串是否为空
 * @param {string} value - 字符串
 * @returns {boolean} 是否为空字符串
 */
export function isEmpty(value) {
  return value === null || value === undefined || value.trim() === '';
}

/**
 * 验证值是否在指定范围内
 * @param {number} value - 数值
 * @param {number} min - 最小值
 * @param {number} max - 最大值
 * @returns {boolean} 是否在范围内
 */
export function isInRange(value, min, max) {
  return value >= min && value <= max;
}

/**
 * 验证字符串长度是否在指定范围内
 * @param {string} value - 字符串
 * @param {number} min - 最小长度
 * @param {number} max - 最大长度
 * @returns {boolean} 是否在范围内
 */
export function isLengthInRange(value, min, max) {
  if (value === null || value === undefined) return false;
  return value.length >= min && value.length <= max;
}

/**
 * 验证字符串是否为有效的URL
 * @param {string} url - URL字符串
 * @returns {boolean} 是否为有效的URL
 */
export function isValidUrl(url) {
  try {
    new URL(url);
    return true;
  } catch (e) {
    return false;
  }
}

export default {
  isValidPhone,
  isValidEmail,
  isValidIdCard,
  checkPasswordStrength,
  isEmpty,
  isInRange,
  isLengthInRange,
  isValidUrl
}; 